import axios from 'axios'
import store from '@/store'
import { Message } from 'element-ui'
import router from '@/router'
  
// axios.create 这是 Axios 提供的一个方法，用于创建一个新的 Axios 实例
const service = axios.create({
  //设置基础地址
  // baseURL:'./api',
  baseURL: process.env.VUE_APP_BASE_API, // 基础地址
  timeout: 90000
}) 
// 请求拦截器
// 成功1 失败2
// service.interceptors.request设置请求拦截器
// use() 方法用于注册一个请求拦截器。它接收两个参数：
//第一个参数是一个函数，接受请求配置对象 config 作为参数。
//第二个参数是一个可选的错误处理函数，用于处理在请求拦截器中发生的错误
service.interceptors.request.use((config) => {
  // 注入token
  //token: state => state.user.token,
  if (store.getters.token) {              //格式
    config.headers.Authorization = `Bearer ${store.getters.token}`
  }
  return config
}, (error) => {
  // 失败执行promise  Promise.reject() 是一个静态方法，用于返回一个被拒绝状态的 Promise。
//这个方法接受一个参数（在这里是 error），该参数通常是一个错误对象或错误信息，表示 Promise 被拒绝的原因。
  return Promise.reject(error)
})



// 响应拦截器
service.interceptors.response.use((response) => {
  // axios默认包裹了data
  //判断一下是不是blob类型
  
  if (response.data instanceof Blob) return response.data;//返回Blob对象
  //这行代码使用解构赋值从 response.data 中提取 data、message 和 success 三个属性。
//response.data 通常是从服务器返回的 JSON 格式的数据，包含了请求的结果。
  const { data, message, success } = response.data //默认json格式
  if (success) {
    return data
  } else {
    Message({ type: 'error', message })
    return Promise.reject(new Error(message))
  }

}, 
async (error) => {
  // 检查是否存在 response 对象
  if (error.response) {
    // 如果状态码是 401，表示 token 超时或未授权
    if (error.response.status === 401) {
      // 显示警告消息
      Message({ type: 'warning', message: 'token超时了' });

      // 调用 action 退出登录
      await store.dispatch('user/logout');

      // 跳转到登录页
      router.push('/login');

      // 返回一个被拒绝的 Promise
      return Promise.reject(error);
    }
  }

  // 如果 error 对象中有 message 属性，则显示错误消息
  const errorMessage = error.message || '发生未知错误';
  Message({ type: 'error', message: errorMessage });

  // 返回一个被拒绝的 Promise
  return Promise.reject(error);
},
)
export default service
